#pragma once

#include "BasicType.h"

namespace LightPlayer{

	enum As2VarType{
		eNull = 0, eString, eFloat, eUndef, eRegister, eBool, eDouble, eInt, eConstante
	};

	union As2VarTypeUnion{
		uint8*			def;
		const char*		str;
		float			f;
		uint8			reg;
		bool			b;
		double			d;
		int				i;
		uint16			cons;
	};

	class As2Var{
		As2VarType			m_type;
		As2VarTypeUnion		m_data;
		string				m_NewStrData;
	public:
		As2Var();
		As2Var(const As2Var& other);
		void init();

		virtual As2VarType getType() const {return m_type;}
		
		float getAsFloat() const;
		int getAsInt() const;
		const char* getAsString() const;
		bool getAsBool() const;

		void set_null()							{ init(); m_type=eNull;											m_data.def	= NULL;					};
		void set_undef()						{ init(); m_type=eUndef;										m_data.def	= NULL;					};
		void set_str(const char* str)			{ init(); m_type=eString;										m_data.str	= str;					};
		void set_NewStr(const char* str)		{ init(); m_type=eString;		m_NewStrData.assign(str);		m_data.str	= m_NewStrData.c_str(); };
		void set_float(float f)					{ init(); m_type=eFloat;										m_data.f	= f;					};
		void set_register(uint8 u)				{ init(); m_type=eRegister;										m_data.reg	= u;					};
		void set_bool(bool b)					{ init(); m_type=eBool;											m_data.b	= b;					};
		void set_double(double d)				{ init(); m_type=eDouble;										m_data.d	= d;					};
		void set_int(int i)						{ init(); m_type=eInt;											m_data.i	= i;					};
		void set_constant(uint16 ui)			{ init(); m_type=eConstante;									m_data.cons = ui;					};
	};

};